/*
 * Created on May 15, 2006
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package ar.edu.utn.frba.gdaia.src.action;

import java.util.Iterator;
import java.util.Map;

import ar.edu.utn.frba.gdaia.src.domain.Canal;

import ar.edu.utn.frba.gdaia.src.domain.Concepto;
import ar.edu.utn.frba.gdaia.src.domain.ConceptoElemental;
import ar.edu.utn.frba.gdaia.src.domain.Regla;
import ar.edu.utn.frba.gdaia.src.externalinterface.Mensaje;
import ar.edu.utn.frba.gdaia.src.externalinterface.TextInterface;
import ar.edu.utn.frba.gdaia.src.main.Cerebro;

/**
 * @author Patricio
 * 
 * Ejecuto la regla seleccionada.
 */
public class DoSelectedRuleCommand extends Command {

	/*
	 * (non-Javadoc)
	 * 
	 * @see ar.edu.utn.frba.gdaia.src.action.Command#execute(java.util.Map)
	 */
	public void execute(Map parameters) {
		// Recupero el cerebro
		Cerebro cerebro = (Cerebro) parameters.get(Command.CEREBRO);
		Canal canalI=Canal.INT_CONCEPTO_INSTRUCCION_CONCEPTO_CANTIDAD;
		ConceptoElemental conceptoComodin=new ConceptoElemental(10001, Concepto.CONC_INSTR_CANTIDAD,canalI);

		// rescato la regla a ejecutar
		Regla reglaAEjecutar = (Regla) parameters.get(Command.REGLA_EXTERNA_TO_RETURN);

		StringBuffer salidaParaMensaje = new StringBuffer();

		if (reglaAEjecutar != null) {
			// agregamos la ultima regla aplicada a la memoria cronologica
			cerebro.addLastToCronMemory(reglaAEjecutar);
			
			// si hay conceptos comodin.
			ConceptoElemental porQuienEsComodin = null;
			boolean hayComodin =false;
			if(reglaAEjecutar.getSituacionInicial().getEstado().contains(conceptoComodin)){
				int indexDelComodin = reglaAEjecutar.getSituacionInicial().getEstado().indexOf(conceptoComodin);
				porQuienEsComodin = (ConceptoElemental)cerebro.getSituacionActual().getEstado().
													get(indexDelComodin); // obtengo el concepto real	
				hayComodin = true;
			}

			// Generamos la salida para la interface
			for (Iterator it = reglaAEjecutar.getSituacionFinal().getEstado().iterator(); it.hasNext();) {
				Concepto concepto = (Concepto) it.next();
				if(hayComodin && concepto.equals(conceptoComodin))			
					concepto = porQuienEsComodin;
				salidaParaMensaje.append(concepto.toString() + " ");
			}

			TextInterface gui = (TextInterface) parameters.get(Command.INTERFACE_EXTERNA);
			gui.putFromMindToUI(new Mensaje(salidaParaMensaje.toString(),Canal.TECLADO));

			// VACIO las situaciones y salvo el momento actual, como momento
			// anterior para el proximo ciclo
			cerebro.getMomentoAnterior().setSituacionPrevia(cerebro.getSituacionActual());
			cerebro.setSituacionActual(null);
			cerebro.setSituacionPrevia(null);
		}
	}
}
